package com.mhb.generator.config;

import com.mhb.generator.config.interfaces.DbQueryInterface;
import com.mhb.generator.config.query.MySqlQuery;
import com.mhb.generator.config.rules.DbType;
import com.mhb.generator.util.ExceptionUtils;
import lombok.Data;
import lombok.experimental.Accessors;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 数据库配置
 *
 * @author 博博
 * @Title: DataSourceConfig
 * @time 2019/12/18 0018 11:24
 */
@Data
@Accessors(chain = true)
public class DataSourceConfig {

    /**
     * 数据库信息查询
     */
    private DbQueryInterface dbQuery;
    /**
     * 数据库类型
     */
    private DbType dbType;

    /**
     * 驱动连接的URL
     */
    private String url;
    /**
     * 驱动名称
     */
    private String driverName;
    /**
     * 数据库连接用户名
     */
    private String username;
    /**
     * 数据库连接密码
     */
    private String password;


    /**
     * 判断数据库类型
     *
     * @return 类型枚举值
     */
    public DbType getDbType() {
        if (null == this.dbType) {
            this.dbType = this.getDbType(this.driverName);
            if (null == this.dbType) {
                this.dbType = this.getDbType(this.url.toLowerCase());
                if (null == this.dbType) {
                    throw ExceptionUtils.mpe("Unknown type of database!");
                }
            }
        }

        return this.dbType;
    }


    /**
     * 判断数据库类型
     *
     * @param str 用于寻找特征的字符串，可以是 driverName 或小写后的 url
     * @return 类型枚举值，如果没找到，则返回 null
     */
    private DbType getDbType(String str) {
        if (str.contains("mysql")) {
            return DbType.MYSQL;
        } else {
            return null;
        }
    }

    /**
     * 获取查询
     *
     * @return 接口实现子类
     */
    public DbQueryInterface getDbQuery() {
        if (null == dbQuery) {
            this.dbQuery = getDbQueryInterfaceImpl();
        }
        return dbQuery;
    }

    /**
     * 获取当前db的接口实现
     *
     * @return 实现的接口
     */
    private DbQueryInterface getDbQueryInterfaceImpl() {
        // 获取db类型
        DbType dbType = getDbType();
        // Mysql
        if (dbType.equals(DbType.MYSQL)) {
            return new MySqlQuery();
        }
        throw ExceptionUtils.mpe("您使用的数据源可能不支持，或者填写错误，");
    }

    /**
     * 创建数据库连接对象
     *
     * @return Connection
     */
    public Connection getConn() {
        Connection conn;
        try {
            Class.forName(driverName);
            conn = DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException | SQLException e) {
            throw new RuntimeException(e);
        }
        return conn;
    }
}
